import { queryInfo } from '@/service/edu/lesson/model'
import { http } from '@/utils/http'

export const appType: string = 'teacher'

/** 获取版本详细信息 */
export const getVersionInfo = (data: queryInfo) => {
  return http({
    url: '/edu/app/version/newInfo',
    method: 'POST',
    data,
  })
}

/**
 * 检查版本更新
 * @param currentVersionCode 当前版本号
 * @param appType 应用类型
 * @returns 是否有新版本
 */
export const checkForUpdate = async (): Promise<boolean> => {
  try {
    const currentVersionCode = Number(uni.getSystemInfoSync().appVersionCode) // 当前App版本号
    const res: any = await getVersionInfo({ appType })
	 console.log('currentVersionCode', currentVersionCode)
    return res.data.versionCode > currentVersionCode
  } catch (error) {
    console.log('checkForUpdate error', error)
    throw new Error('检查更新失败')
  }
}

/**
 * @description H5+下载App
 * @param downloadUrl App下载链接
 * @param progressCallBack 下载进度回调
 * @returns Promise<string> 下载成功返回文件路径
 */
export const downloadApp = (
  downloadUrl: string,
  progressCallBack: (progress: number) => void = () => {},
): Promise<string> => {
  return new Promise((resolve, reject) => {
    // 创建下载任务
    const downloadTask = plus.downloader.createDownload(
      downloadUrl,
      {
        method: 'GET',
      },
      (task: PlusDownloaderDownloadTask, status: number) => {
        console.log(status, 'status')
        if (status === 200) {
          // 下载成功
          resolve(task.filename)
        } else {
          reject('fail')
          uni.showToast({
            title: '下载失败',
            duration: 1500,
            icon: 'none',
          })
        }
      },
    )

    // 监听下载过程
    downloadTask.addEventListener(
      'statechanged',
      (task: PlusDownloaderDownloadTask, status: number) => {
        switch (task.state) {
          case 1: // 开始
            break
          case 2: // 已连接到服务器
            break
          case 3: // 已接收到数据
            const hasProgress = task.totalSize && task.totalSize > 0 // 是否能获取到App大小
            if (hasProgress) {
              const current = parseInt(((100 * task.downloadedSize) / task.totalSize).toString()) // 获取下载进度百分比
              progressCallBack(current)
            }
            break
          case 4: // 下载完成
            break
        }
      },
    )

    // 开始执行下载
    downloadTask.start()
  })
}

/**
 * @description H5+安装APP
 * @param fileName app文件名
 * @param callBack 安装成功回调
 */
export const installApp = (fileName: string, callBack: () => void = () => {}): void => {
  // 注册广播监听app安装情况
  onInstallListening(callBack)

  // 开始安装
  plus.runtime.install(
    plus.io.convertLocalFileSystemURL(fileName),
    {},
    () => {
      // 成功跳转到安装界面
    },
    (error: any) => {
      uni.showToast({
        title: '安装失败' + error,
        duration: 1500,
        icon: 'none',
      })
    },
  )
}

/**
 * @description 注册广播监听APP是否安装成功
 * @param callBack 安装成功回调函数
 */
const onInstallListening = (callBack: () => void = () => {}): void => {
  const mainActivity = plus.android.runtimeMainActivity() // 获取activity

  // 生成广播接收器
  const receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
    onReceive: (context: any, intent: any) => {
      // 接收广播回调
      plus.android.importClass(intent)
      mainActivity.unregisterReceiver(receiver) // 取消监听
      callBack()
    },
  })

  const IntentFilter = plus.android.importClass('android.content.IntentFilter')
  const Intent = plus.android.importClass('android.content.Intent')
  const filter = new IntentFilter()
  filter.addAction(Intent.ACTION_PACKAGE_ADDED) // 监听APP安装
  filter.addDataScheme('package')
  mainActivity.registerReceiver(receiver, filter) // 注册广播
}
